package controller

import (
	"errors"
	"github.com/gin-gonic/gin"
	"strconv"
)

// CtxUserIDKey 是用于在 Gin 上下文中存储用户 ID 的键。
// 它用于在后续处理程序中检索用户 ID。
const CtxUserIDKey = "userID"

// ErrorUserNotLogin 是一个错误，表示当前用户未登录。
// 当尝试获取当前用户失败时，将返回此错误。
var ErrorUserNotLogin = errors.New("当前用户未登录")

// getCurrentUser 尝试从 Gin 上下文中获取当前用户的 ID。
// 如果用户未登录或用户 ID 类型不正确，将返回 ErrorUserNotLogin 错误。
// 参数:c - Gin 上下文指针，用于从中提取用户 ID。
// 返回值:userID - 用户 ID，如果成功获取。
// err - 错误，如果获取失败。
func getCurrentUserID(c *gin.Context) (userID int64, err error) {
	// 从上下文中获取用户 ID
	uid, ok := c.Get(CtxUserIDKey)
	if !ok {
		// 如果未找到用户 ID，返回未登录错误
		err = ErrorUserNotLogin
		return
	}
	// 将用户 ID 转换为 int64 类型
	userID, ok = uid.(int64)
	if !ok {
		// 如果类型转换失败，返回未登录错误
		err = ErrorUserNotLogin
		return
	}
	return
}

// getPageInfo 从请求上下文中提取并解析分页信息
func getPageInfo(c *gin.Context) (page, size int64, err error) {
	// 1.处理分页
	// 获取请求查询参数中的页码字符串
	pageStr := c.Query("page")
	// 获取请求查询参数中的每页条目数字符串
	sizeStr := c.Query("size")
	// 将页码字符串转换为int64类型，如果转换失败则默认为第1页
	page, err = strconv.ParseInt(pageStr, 10, 64)
	if err != nil {
		page = 1
	}
	// 将每页条目数字符串转换为int64类型，如果转换失败则默认为10条
	size, err = strconv.ParseInt(sizeStr, 10, 64)
	if err != nil {
		size = 10
	}
	// 返回解析后的页码、每页条目数及可能的错误
	return
}
